package coba.mailing.mail;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;

import coba.mailing.body.Body10;
import coba.mailing.function.NextXday;
import coba.mailing.function.SumAtractivos;
import coba.mailing.jdbc.ConnectionFactory;
import coba.mailing.model.Atractivo;
import coba.mailing.model.AtractivoSum;
import coba.mailing.model.Guia;
import coba.mailing.model.Solicitud;
import coba.mailing.procedure.AddAllCC;
import coba.mailing.procedure.AddAllTo;
import coba.mailing.properties.MainProperties;
import coba.mailing.query.FindAtractivoByItinerarioIdQuery;
import coba.mailing.query.FindGuiaBySolicitudId;
import coba.mailing.query.FindSolicitudCanceladasBetween;

public class Mail10 {

	public static void sendAll() throws ClassNotFoundException, IOException, SQLException, EmailException {
		Connection con = ConnectionFactory.getConnection();

		Calendar today0Hour = GregorianCalendar.getInstance();

		today0Hour.set(Calendar.HOUR_OF_DAY, 0);
		today0Hour.set(Calendar.MINUTE, 0);
		today0Hour.set(Calendar.SECOND, 0);
		today0Hour.set(Calendar.MILLISECOND, 0);

		// Sunday, this week
		Date fechaHasta = NextXday.nextXday(Calendar.SUNDAY, today0Hour.getTime());

		// Sunday, next week
		if (today0Hour.get(Calendar.DAY_OF_WEEK) >= Calendar.WEDNESDAY) {
			Calendar calFechaHasta = GregorianCalendar.getInstance();
			calFechaHasta.setTime(fechaHasta);
			calFechaHasta.add(Calendar.DATE, 7);
			fechaHasta = calFechaHasta.getTime();
		}

		List<Solicitud> listSolicitud = FindSolicitudCanceladasBetween.find(con);

		for (Solicitud solicitud : listSolicitud) {
			try {
				Date fechaATenerEnCuenta = null;

				if (solicitud.getFechaBaja() != null)
					fechaATenerEnCuenta = solicitud.getFechaItinerario();
				else
					fechaATenerEnCuenta = solicitud.getFechaPreviaItinerario();

				if (fechaATenerEnCuenta.compareTo(new Date()) >= 0 &&
						fechaATenerEnCuenta.compareTo(fechaHasta) <= 0) {

					List<Atractivo> listAtractivo = FindAtractivoByItinerarioIdQuery.find(con, solicitud.getItinerarioId());
					List<AtractivoSum> listAtractivoSum = SumAtractivos.sumAtractivos(listAtractivo);
					List<Guia> listGuia = FindGuiaBySolicitudId.find(con, solicitud.getSolicitudId());

					for (AtractivoSum atractivoSum : listAtractivoSum) {
						if (atractivoSum.getMails() != null &&
								!atractivoSum.getMails().trim().equals("")) {
							Long horaComienzo = atractivoSum.getHoraComienzo() / 100;
							Long minutoComienzo = atractivoSum.getHoraComienzo() % 100;

							String strHoraMinutoComienzo = horaComienzo + ":" + String.format("%02d", minutoComienzo);

							if (fechaATenerEnCuenta != null)
								send(solicitud, atractivoSum.getMails(), strHoraMinutoComienzo, listGuia);
						}
					}
				}
			}
			catch (Exception e) {
				e.printStackTrace();
			}

		}

		con.close();
	}

	public static void send(Solicitud solicitud, String mailsTo, String strHoraMinutoComienzo, List<Guia> listGuia) throws EmailException, IOException {
		MainProperties mainProperties = MainProperties.getInstance();

		HtmlEmail email = new HtmlEmail();

		email.setCharset("utf-8");
		email.setHostName(mainProperties.getProperty("smtpServer"));
		email.setSmtpPort(Integer.valueOf(mainProperties.getProperty("smtpPort")));

		AddAllTo.addAllTo(email, mailsTo);
		AddAllCC.addAllCC(email, mainProperties.getProperty("mail10Ccs"));

		email.setFrom(mainProperties.getProperty("fromMail"), mainProperties.getProperty("fromName"));

		Date fechaATenerEnCuenta = null;

		if (solicitud.getFechaBaja() != null)
			fechaATenerEnCuenta = solicitud.getFechaItinerario();
		else
			fechaATenerEnCuenta = solicitud.getFechaPreviaItinerario();

		email.setSubject("ConociendoBA - CANCELACIÓN VISITA " +
				new SimpleDateFormat("dd/MM/yyyy").format(fechaATenerEnCuenta));

		String cid = email.embed(ClassLoader.getSystemClassLoader().getResource("coba-mail-footer.jpg"), "Conociendo footer");

		email.setHtmlMsg(Body10.get(cid, solicitud, strHoraMinutoComienzo, listGuia));

		email.send();
	}

}
